package bean;

import org.junit.Test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ToolTest {

    public void test1(){
        List<String> list = new ArrayList<>();
        list.add("泛型擦有类型限制");
//        list.add(12345);//正常情况指定了泛型后不能使用其他类型的数据
    }

    @Test
    public void test2(){
        List<String> list = new ArrayList<>();
        list.add("泛型擦有类型限制");
        Class<? extends List> aClass = list.getClass();
        try {
            try {
                Method method = aClass.getDeclaredMethod("add", Object.class);// 反射获取add方法，其类型是Object
                method.invoke(list,"asdfg");
                method.invoke(list,12345);// 反射使用List<String>的add方法，这时候没有了类型限制
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        for (Object s : list) {
            System.out.println("s=="+s);//这样输出报错，List中添加了一个int类型的12345
        }

    }

    public <T>T test3(T t){
        // 泛型方法 返回值是T ;前面的<T>是类型参数说明
        return null;
    }

    @Test
    public void test4(){
        List<?> [] lists= new ArrayList<?>[2];
        lists[1] = new ArrayList<>();
        byte b[] = new byte[Integer.MAX_VALUE];
        String ss = new String(b);
    }

}

